JWTについての学び
概要
この辺見て勉強する。
RFC 7519
https://tools.ietf.org/html/rfc7519
なんのためのものなのか
Auth、InformationExchange とある。
構成要素
header, payload, signatureの三つ。
すべてオリジナルはJSON形式。実際の値になるときには暗号化されたりしている。
header
typeとアルゴリズムの指定記述が入る。
type(キーはtyp)にはJWT、アルゴリズム指定(キーはalg)にはアルゴリズムの種類が入る。
{
"alg": "HS256",
"typ": "JWT"
}
この値はBase64エンコードされる。
payload
エンティティ。claimsというパラメータを含む。
claimsは3タイプに分かれる。
Reserved, Public, Private
Reserved
JWTで定義されている定義済みのclaims。
例えばiss(issuer)、exp(expiration time)、sub(subject) とか。
3文字。このへんからコンパクトにしたいらしい。
Public
IANA JSON Web Token Registryとかの定義されてるもの。
https://www.iana.org/assignments/jwt/jwt.xhtml
Private
カスタム。公には共有せず、サービス内とかで共有すべきもの。
payloadのサンプルはこんな感じ。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
これもBase64エンコードされる。
signature
作成するにはエンコードされたheaderとpayloadとシークレット、
headerに記述されたアルゴリズムが必要で、それらを使ってsignしたものがsignatureになる。
具体例としてHMACSHA256を使ってsignatureを作るコードは次のような感じになる。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
ふむふむ。headerをエンコードしたもの + “.” + payloadをエンコードしたものを、secretをキーに使ってHMACSHA256にかければいいと。
こうして作成されたsignatureは、経路でデータ改ざんがされなかったことの保証や、誰がこのデータ(JWT)の発行者かなどを保証するために使われる。
で、ここまでの成果物は、次の通りになる。
header(encoded)
payload(encoded)
secret
signature
で、これらを次の形でつなげる。
header(encoded) + ”.” + payload(encoded) + “.” + signature
ふむふむ
・headerに書いてあるアルゴリズムとsecretを事前に知らなければ復号できない
という感じか。
動作について
ユーザーが持っていたcredentialでログインできたら、サーバーはJWTをユーザーに渡す。
ユーザーはサーバーにアクセスする際、AuthorizationヘッダにJWTを乗せる必要がある。
その際Bearerスキーマでセットして送る。
Authorization: Bearer <token>
こうするとサーバーのメモリ上にも一切ユーザー関連のデータが残らないのでステートレスにできるよねっていう話。
JWTの利点
SimpleWebToken(SWT), SAML(Security Assertion Markup Language)と比較してる。
JSONはXMLより簡潔なので、エンコードされたサイズも小さい。
で、まあ、SAMLより小さい。これはHTTPとかでデータをやり取りするのに適してると思う。
セキュリティの観点で、SWTは対称暗号でのHMACしか選べない。
でもJWTやSAMLでは公開暗号がsigningに使える(X509)。
その上で、JSON使ってやったほうが楽だよねみたいな。
JSONパーサはこの世にいっぱいあるんでXML(要はSAML)よりいいよねみたいな話。
Auth0について
オースゼロ、っていう会社かこれ。
なんかAPIを提供するのを商売にしてるっぽい。
横道、認証と認可について
http://dev.classmethod.jp/security/authentication-and-authorization/
認証=Authentication:誰かを確かめること
例:adminなのかどうか判断する
認可=Authorization:権限、許可を与えること
例:切符を持っているので電車に乗っていい
実用例
ネームスペースはIANAに登録があるよ
https://www.iana.org/assignments/jwt/jwt.xhtml
このへんから漁ってほしいものをPayloadの中身のキーとして使うと良いよって話。